package br.com.saeng2D.objeto.forca_d;

import java.awt.Color;
import java.awt.Graphics2D;
import java.io.PrintWriter;

import br.com.saeng2D.objeto.AbstratoContainer;
import br.com.saeng2D.objeto.AbstratoObjeto;
import br.com.saeng2D.objeto.animado.VetorAnimado;
import br.com.saeng2D.objeto.linha.Linha;
import br.com.saeng2D.objeto.ponto.Ponto;
import br.com.saeng2D.util.R2D;
import br.com.saeng2D.util.Util;

public class ForcaDinamica extends AbstratoContainer {
	private Linha linha;
	private String variavelForca;
	private Color corVariavelForca;
	private Ponto pontoVariavelForca;
	
	
	public ForcaDinamica(String chaveCor) {
		super(null, "forca_dinamica", -1, -1, -1, -1);
		this.corFundo = Util.getCor(chaveCor);
	}

	public boolean ehIgual(AbstratoObjeto objeto) {
		return false;
	}

	public void alterarTamanho(int tamanho) {
	}

	public void desenhar(Graphics2D g2) {
		if(!isVisivel()) {
			return;
		}
		g2.setStroke(AbstratoObjeto.LARGURA_LINHA_ABSTRATO_OBJETO);
		if (selecionado) {
			g2.setColor(corSelecionado);
		} else {
			g2.setColor(corFundo);
		}
		for(AbstratoObjeto reta : filhos) {
			reta.desenhar(g2);
		}
		if(variavelForca != null && pontoVariavelForca != null) {
			g2.setColor(corVariavelForca);
			g2.drawString(variavelForca, pontoVariavelForca.getX(), pontoVariavelForca.getY());
		}
	}

	public boolean estarSob(int x, int y) {
		if(contemFilhos()) {
			Reta reta = (Reta) getFilho(0);
			Ponto ponto1 = new Ponto(reta.getX1(), reta.getY1());
			Ponto ponto2 = new Ponto(reta.getX2(), reta.getY2());
			Linha linha = new Linha(ponto1, ponto2);
			return linha.estarSob(x, y);
		}
		return false;
	}

	public R2D getArea() {
		if(contemFilhos()) {
			Reta reta = (Reta) getFilho(0);
			Ponto ponto1 = new Ponto(reta.getX1(), reta.getY1());
			Ponto ponto2 = new Ponto(reta.getX2(), reta.getY2());
			Linha linha = new Linha(ponto1, ponto2);
			return linha.getArea();
		}
		return new R2D(x, y, largura, altura);
	}

	public AbstratoObjeto prototipo() {
		return null;
	}

	public Linha getLinha() {
		return linha;
	}

	public void setLinha(Linha linha) {
		this.linha = linha;
	}
	
	public void antesExclusao() {
		linha.setPontoCentral(null);
	}

	public String getVariavelForca() {
		return variavelForca;
	}

	public void setVariavelForca(String variavelForca) {
		this.variavelForca = variavelForca;
	}

	public Ponto getPontoVariavelForca() {
		return pontoVariavelForca;
	}

	public void setPontoVariavelForca(Ponto pontoVariavelForca) {
		this.pontoVariavelForca = pontoVariavelForca;
	}

	public Color getCorVariavelForca() {
		return corVariavelForca;
	}

	public void setCorVariavelForca(Color corVariavelForca) {
		this.corVariavelForca = corVariavelForca;
	}
	
	public void salvarXML(String prefixo, PrintWriter pw) {
		int xx = pontoVariavelForca.getX();
		int yy = pontoVariavelForca.getY();
		Ponto p1 = linha.getPonto1();
		Ponto p2 = linha.getPonto2();
		int x1 = p1.getX();
		int x2 = p2.getX();
		int y1 = p1.getY();
		int y2 = p2.getY();
		pw.print(prefixo + "\t<" + descricao + " x=\"" + xx + "\" y=\"" + yy+ "\" ponto1_x='" + x1 + "' ponto1_y='" + y1 + "' ponto2_x='" + x2 + "' ponto2_y='" + y2 + "' stringValorNewton=\"" + variavelForca + "\"/>\r\n");
	}
	
	public final void restaurar(int xx, int yy, Linha linha, String stringValorNewton) {
		
		this.pontoVariavelForca = new Ponto(xx,yy);
		this.linha = linha;
		this.variavelForca = stringValorNewton;
	}
}